#include<stdio.h>
#include<unistd.h>
#include<string.h>
int main()
{
    //C语言的输出接口
    const char*msg="hello fwrite";
    printf("hello printf");
    fprintf(stdout,"%s","hello fprintf");//stdout---> 1号文件
    fwrite(msg,strlen(msg),1,stdout);
    //当把C接口的字符串\n去掉后，然后关闭1号文件，会出现什么都不打印的情况
    //因为没有了\n,缓冲区就不会被刷新，只有在进程结束时才会刷新，但是由于1号文件被关闭
    //所以什么都不会打印
    //系统调用接口
    //如果不关闭一号文件，直接向显示器打印的话，会出现重定向到文件一样的情况，C接口会被打印两次
    const char*buf="hello write";
    write(1,buf,strlen(buf));
   // close(1);
    fork();
    //为什么创建子进程后向显示器打印只会打印一次，而将打印内容重定向到文件里C语言接口却打印了两次呢？
    //因为向显示器打印时采用行缓冲，遇到\n就会刷新缓冲区，当创建子进程时，父进程的缓冲区已经清空了，所以子进程什么都不会干
    //重定向到文件时，为了提高IO效率，缓冲区变成了全缓冲方式，即只有当缓冲区被写满或者进程退出时缓冲区才会被刷新
    //所以当创建子进程时，父进程的缓冲区内容都在，这时父进程程序结束将要清空缓冲区时，子进程对缓冲区内容进行写时拷贝
    //然后子进程退出时将子进程缓冲区内容刷新，所以C语言接口被调用了两次
    //由于write是系统调用接口，它是直接将内容刷新到内核缓冲区，不会放到C语言缓冲区里，所以不会受影响
    return 0;
}
